home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / linux / inet_lro.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  4.7 KB  |  185 lines

  1. /*
  2.  *  linux/include/linux/inet_lro.h
  3.  *
  4.  *  Large Receive Offload (ipv4 / tcp)
  5.  *
  6.  *  (C) Copyright IBM Corp. 2007
  7.  *
  8.  *  Authors:
  9.  *       Jan-Bernd Themann <themann@de.ibm.com>
  10.  *       Christoph Raisch <raisch@de.ibm.com>
  11.  *
  12.  *
  13.  * This program is free software; you can redistribute it and/or modify
  14.  * it under the terms of the GNU General Public License as published by
  15.  * the Free Software Foundation; either version 2, or (at your option)
  16.  * any later version.
  17.  *
  18.  * This program is distributed in the hope that it will be useful,
  19.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  20.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21.  * GNU General Public License for more details.
  22.  *
  23.  * You should have received a copy of the GNU General Public License
  24.  * along with this program; if not, write to the Free Software
  25.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  26.  */
  27.  
  28. #ifndef __INET_LRO_H_
  29. #define __INET_LRO_H_
  30.  
  31. #include <net/ip.h>
  32. #include <net/tcp.h>
  33.  
  34. /*
  35.  * LRO statistics
  36.  */
  37.  
  38. struct net_lro_stats {
  39.     unsigned long aggregated;
  40.     unsigned long flushed;
  41.     unsigned long no_desc;
  42. };
  43.  
  44. /*
  45.  * LRO descriptor for a tcp session
  46.  */
  47. struct net_lro_desc {
  48.     struct sk_buff *parent;
  49.     struct sk_buff *last_skb;
  50.     struct skb_frag_struct *next_frag;
  51.     struct iphdr *iph;
  52.     struct tcphdr *tcph;
  53.     struct vlan_group *vgrp;
  54.     __wsum  data_csum;
  55.     __be32 tcp_rcv_tsecr;
  56.     __be32 tcp_rcv_tsval;
  57.     __be32 tcp_ack;
  58.     u32 tcp_next_seq;
  59.     u32 skb_tot_frags_len;
  60.     u16 ip_tot_len;
  61.     u16 tcp_saw_tstamp;         /* timestamps enabled */
  62.     __be16 tcp_window;
  63.     u16 vlan_tag;
  64.     int pkt_aggr_cnt;        /* counts aggregated packets */
  65.     int vlan_packet;
  66.     int mss;
  67.     int active;
  68. };
  69.  
  70. /*
  71.  * Large Receive Offload (LRO) Manager
  72.  *
  73.  * Fields must be set by driver
  74.  */
  75.  
  76. struct net_lro_mgr {
  77.     struct net_device *dev;
  78.     struct net_lro_stats stats;
  79.  
  80.     /* LRO features */
  81.     unsigned long features;
  82. #define LRO_F_NAPI            1  /* Pass packets to stack via NAPI */
  83. #define LRO_F_EXTRACT_VLAN_ID 2  /* Set flag if VLAN IDs are extracted
  84.                     from received packets and eth protocol
  85.                     is still ETH_P_8021Q */
  86.  
  87.     /*
  88.      * Set for generated SKBs that are not added to
  89.      * the frag list in fragmented mode
  90.      */
  91.     u32 ip_summed;
  92.     u32 ip_summed_aggr; /* Set in aggregated SKBs: CHECKSUM_UNNECESSARY
  93.                  * or CHECKSUM_NONE */
  94.  
  95.     int max_desc; /* Max number of LRO descriptors  */
  96.     int max_aggr; /* Max number of LRO packets to be aggregated */
  97.  
  98.     int frag_align_pad; /* Padding required to properly align layer 3
  99.                  * headers in generated skb when using frags */
  100.  
  101.     struct net_lro_desc *lro_arr; /* Array of LRO descriptors */
  102.  
  103.     /*
  104.      * Optimized driver functions
  105.      *
  106.      * get_skb_header: returns tcp and ip header for packet in SKB
  107.      */
  108.     int (*get_skb_header)(struct sk_buff *skb, void **ip_hdr,
  109.                   void **tcpudp_hdr, u64 *hdr_flags, void *priv);
  110.  
  111.     /* hdr_flags: */
  112. #define LRO_IPV4 1 /* ip_hdr is IPv4 header */
  113. #define LRO_TCP  2 /* tcpudp_hdr is TCP header */
  114.  
  115.     /*
  116.      * get_frag_header: returns mac, tcp and ip header for packet in SKB
  117.      *
  118.      * @hdr_flags: Indicate what kind of LRO has to be done
  119.      *             (IPv4/IPv6/TCP/UDP)
  120.      */
  121.     int (*get_frag_header)(struct skb_frag_struct *frag, void **mac_hdr,
  122.                    void **ip_hdr, void **tcpudp_hdr, u64 *hdr_flags,
  123.                    void *priv);
  124. };
  125.  
  126. /*
  127.  * Processes a SKB
  128.  *
  129.  * @lro_mgr: LRO manager to use
  130.  * @skb: SKB to aggregate
  131.  * @priv: Private data that may be used by driver functions
  132.  *        (for example get_tcp_ip_hdr)
  133.  */
  134.  
  135. void lro_receive_skb(struct net_lro_mgr *lro_mgr,
  136.              struct sk_buff *skb,
  137.              void *priv);
  138.  
  139. /*
  140.  * Processes a SKB with VLAN HW acceleration support
  141.  */
  142.  
  143. void lro_vlan_hwaccel_receive_skb(struct net_lro_mgr *lro_mgr,
  144.                   struct sk_buff *skb,
  145.                   struct vlan_group *vgrp,
  146.                   u16 vlan_tag,
  147.                   void *priv);
  148.  
  149. /*
  150.  * Processes a fragment list
  151.  *
  152.  * This functions aggregate fragments and generate SKBs do pass
  153.  * the packets to the stack.
  154.  *
  155.  * @lro_mgr: LRO manager to use
  156.  * @frags: Fragment to be processed. Must contain entire header in first
  157.  *         element.
  158.  * @len: Length of received data
  159.  * @true_size: Actual size of memory the fragment is consuming
  160.  * @priv: Private data that may be used by driver functions
  161.  *        (for example get_tcp_ip_hdr)
  162.  */
  163.  
  164. void lro_receive_frags(struct net_lro_mgr *lro_mgr,
  165.                struct skb_frag_struct *frags,
  166.                int len, int true_size, void *priv, __wsum sum);
  167.  
  168. void lro_vlan_hwaccel_receive_frags(struct net_lro_mgr *lro_mgr,
  169.                     struct skb_frag_struct *frags,
  170.                     int len, int true_size,
  171.                     struct vlan_group *vgrp,
  172.                     u16 vlan_tag,
  173.                     void *priv, __wsum sum);
  174.  
  175. /*
  176.  * Forward all aggregated SKBs held by lro_mgr to network stack
  177.  */
  178.  
  179. void lro_flush_all(struct net_lro_mgr *lro_mgr);
  180.  
  181. void lro_flush_pkt(struct net_lro_mgr *lro_mgr,
  182.            struct iphdr *iph, struct tcphdr *tcph);
  183.  
  184. #endif
  185.